package org.example.chatmemory;

import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import lombok.SneakyThrows;

import java.util.ArrayList;
import java.util.List;

import static dev.langchain4j.data.message.ChatMessageDeserializer.messagesFromJson;
import static dev.langchain4j.data.message.ChatMessageSerializer.messagesToJson;

/**
 * 持久化聊天记忆存储实现类
 * 实现了ChatMemoryStore接口，用于将聊天消息持久化到数据库中
 */
public class PersistentChatMemoryStore implements ChatMemoryStore {

    /**
     * 根据memoryId获取聊天消息列表
     *
     * @param memoryId ID，用于标识特定的聊天会话
     * @return 聊天消息列表，如果未找到则返回空列表
     */
    @Override
    @SneakyThrows
    public List<ChatMessage> getMessages(Object memoryId) {
        // 从数据库中获取指定memoryId的聊天消息
        Entity chatMsg = Db.use().get(Entity.create("chat_msg").set("uid", memoryId));
        if (chatMsg != null) {
            //获取message字段内容
            String message = chatMsg.getStr("message");
            //String message = "[{\"role\":\"user\",\"content\":\"你好\"},{\"role\":\"assistant\",\"content\":\"你好！有什么可以帮助你的吗？\"}]";

            //将message字段内容转换成ChatMessage列表
            List<ChatMessage> chatMessages = messagesFromJson(message);
//            [
//                {
//                    "role": "user",
//                        "content": "你好",
//                        "timestamp": "2024-01-01T10:00:00Z"
//                },
//                {
//                    "role": "assistant",
//                        "content": "你好！有什么可以帮助你的吗？",
//                        "timestamp": "2024-01-01T10:00:01Z"
//                },
//                {
//                    "role": "user",
//                        "content": "我想了解一下LangChain4J",
//                        "timestamp": "2024-01-01T10:00:30Z"
//                }
//            ]
            return chatMessages;
        } else {
            return new ArrayList<>();
        }
    }

    /**
     * 更新指定memoryId的聊天消息列表
     *
     * @param memoryId ID，用于标识特定的聊天会话
     * @param messages 要更新的聊天消息列表
     */
    @Override
    @SneakyThrows
    public void updateMessages(Object memoryId, List<ChatMessage> messages) {
        // 从数据库中获取指定memoryId的聊天消息
        Entity chatMsg = Db.use().get(Entity.create("chat_msg").set("uid", memoryId));
        if (chatMsg != null) {
            // 如果记录存在，则更新消息内容
            Db.use().update(
                    //更新内容
                    Entity.create().set("message", messagesToJson(messages)),
                    //where条件
                    Entity.create("chat_msg").set("uid", memoryId)
            );
        } else {
            // 如果记录不存在，则插入新记录
            Db.use().insert(
                    Entity.create("chat_msg")
                            .set("uid", memoryId)
                            .set("message", messagesToJson(messages))
            );
        }
    }

    /**
     * 删除指定memoryId的聊天消息
     *
     * @param memoryId ID，用于标识特定的聊天会话
     */
    @Override
    @SneakyThrows
    public void deleteMessages(Object memoryId) {
        // 从数据库中删除指定memoryId的聊天消息
        Db.use().del(
                //删除条件
                Entity.create("chat_msg").set("uid", memoryId)
        );
    }
}
